import json
from collections import defaultdict
import matplotlib.pyplot as plt

# 修改1
# with open("E:\\datasets\\PCB\\PCB_DATASET\\Annotations\\train.json") as f:
with open("D:\\Tools\\yolo\\dlb\\PCB_DATASET\Annotations\\train.json") as f:
    data = json.load(f)

imgs = {}
for img in data['images']:
    imgs[img['id']] = {
        'h': img['height'],
        'w': img['width'],
        'area': img['height'] * img['width'],
    }

hw_ratios = []
area_ratios = []
label_count = defaultdict(int)
for anno in data['annotations']:
    hw_ratios.append(anno['bbox'][3]/anno['bbox'][2])
    area_ratios.append(anno['area']/imgs[anno['image_id']]['area'])
    label_count[anno['category_id']] += 1

print(label_count, len(data['annotations']) / len(data['images']))

plt.hist(hw_ratios, bins=100, range=[0, 2])
plt.show()

plt.hist(area_ratios, bins=100, range=[0, 0.005])
plt.show()
'''
结果如下：
(defaultdict(int, {3: 399, 5: 416, 2: 435, 6: 447, 4: 412, 1: 418}),
 4.261382799325464)
1、从标签来看，总共6个类别，如果加上背景类，总共7个类别；
2、各类别之间的框数量相对较平均，不需要调整默认的损失函数。（如果类别之间相差较大，建议调整损失函数，如BalancedL1Loss）；
3、平均每张图的框数量在4张左右，属于比较稀疏的检测；
4、真实框的宽高比，可以看到大部分集中在1.0左右，但也有部分在0.5-1之间，少部分在1.25-2.0之间；
5、真实框在原图的大小比例，可以看到大部分框只占到了原图的0.1%，甚至更小，因此基本都是很小的目标。
'''
